ax1,ay1,ax2,ay2,bx1,bx2,by1,by2=-3,0,3,4,0,-1,9,2
def computeArea(ax1,ay1,ax2,ay2,bx1,by1,bx2,by2):
    s_a=(ay2-ay1)*(ax2-ax1)
    s_b=(by2-by1)*(bx2-bx1)
    if ax1>=bx2 or ax2<=bx1:
        #两个矩形在横坐标上就已经决定了不会有交接的可能性
        return s_a+s_b
    if ay1>=by2 or by1>=ay2:
        # 从纵向上决定其不会有交接的机会
        return s_a+s_b
    #剩下的肯定就是需要有交叉的情况
    # 交叉点取值：
    #关注交叉部分的右边界的x值，我们取两个x2的较小值
    x2,y2=min(ax2,bx2),min(ay2,by2)
    #关于交叉部分的左边界的x值，我们取两个x1中的较大值
    x1,y1=max(ax1,bx1),max(ay1,by1)
    return s_a+s_b-(x2-x1)*(y2-y1)

#代码优化
def computeArea_1(ax1,ay1,ax2,ay2,bx1,by1,bx2,by2):
    x=max(0,min(ax2,bx2)-max(ax1,bx1))
    y=max(0,min(ay2,by2)-max(ay1,by1))
    return (ax2-ax1)*(ay2-ay1)+(bx2-bx1)*(by2-by1)-(x*y)
print(computeArea_1(ax1,ay1,ax2,ay2,bx1,bx2,by1,by2))

